package keer.httpinterface.annotation;

import keer.httpinterface.HttpInterceptor;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * HttpInterface主注解，通过此注解标注一个接口，表明此接口可创建http接口代理。
 * 此注解中对应的属性将作为整个接口中所有请求方法的基础默认值，也就是说，如果某个请求方法没有对应属性，
 * 那么将会使用此注解中对应的属性作为默认值。如果这些方法有对应的配置，则以此注解的配置作为基础进行添加或覆盖
 *
 * @author keer
 * @see Request
 * @see Header
 * @see Param
 * @see HttpInterceptor
 * @since 1.0.0
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
public @interface HttpInterface {
    /**
     * 基础请求的url，接口中每个方法的请求地址将于此作为基础的地址
     *
     * @return
     */
    String url() default "";

    /**
     * 基础请求的url，接口中每个方法的请求地址将于此作为基础的地址
     *
     * @return
     */
    @Alias(property = "url")
    String value() default "";

    /**
     * 基础请求头配置，接口中每个方法的请求头以此作为基础进行增加和覆盖
     *
     * @return
     */
    Header[] headers() default {};

    /**
     * 基础请求参数配置，接口中每个方法的请求参数以此作为基础进行增加和覆盖
     *
     * @return
     */
    Param[] params() default {};

    /**
     * 基础拦截器配置，接口中每个方法的请求都会经过此配置的拦截器
     *
     * @return
     */
    Class<? extends HttpInterceptor>[] interceptors() default {};
}
